home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™94 / Talks & Papers / Timothy Knox / Pocket6.3 / Source / Interface.txt < prev    next >
Text File  |  1994-06-24  |  18KB  |  632 lines

  1. ; Interface.txt -- interface routines  3:37:12 PM  2/4/87
  2. ; Fri Jan 22, 1988 12:52:12 version 0.3
  3. ; Fri Feb 12, 1988 13:35:10 3+ menus
  4. ; Wed Mar 30, 1988 13:37:36 'newer' routine
  5. ; Thu Apr 07, 1988 16:00:59 nested loads
  6. ; Mon Apr 18, 1988 14:06:09 restructure variables, echo
  7. ; Sun May 01, 1988 10:38:11 fix emptyFS to skip nil handles
  8. ; Mon May 27, 1991 17:41:00 use wne based event loop and zoomin&out handlers
  9. ; Fri May 30, 1991 05:09:00 handler for "high level events"
  10. ; Sun Apr 12, 1992 22:48:00 move tib and userVars from ainterp
  11. ; Sun Apr 19, 1992 23:24:00 apple events
  12. ; Fri Jan 22, 1993 19:28:00 fix KEYEVT
  13. ; Sun Jul 04, 1993 07:55:00 0.6.3
  14.  
  15. theWindow:    DC.L    0        ; pointer  ( 0 +md )
  16.     WContRect:    DC.W    0,0        ; ( 4 +md )
  17.     WSize:    DC.W    WHeight,WWidth    ; ( 8 +md )
  18.  
  19. Activate:    DC.W    drop-Base    ; ( 12 +md )
  20. Update:        DC.W    curs-Base    ; ( 14 +md )
  21. Button:        DC.W    beep-Base    ; ( 16 +md )
  22. YourMenu:    DC.W    menus-Base    ; ( 18 +md )
  23. Runner:        DC.W    null-Base    ; ( 20 +md )
  24. Closer:        DC.W    bye-Base    ; ( 22 +md )
  25. About:        DC.W    doabout-base    ; ( 24 +md )
  26. Newer:        DC.W    null-base    ; ( 26 +md )
  27. Echo:        DC.W    -1        ; ( 28 +md )
  28.  
  29. AppleMenu:    DC.L    0        ; ( 30 +md )
  30. FileMenu:    DC.L    0        ; ( 34 +md )
  31. EditMenu:    DC.L    0        ; ( 38 +md )
  32.  
  33. TextO:        DC.L    0        ; TextOffset ( 42 +md )
  34. TextE:        DC.L    0        ; TextEnd
  35. TextH:        DC.L    0        ; TextHandle
  36. FStack:        DCB.L    5,0        ; text block handles
  37. FOfsets:    DCB.L    5,0        ; text block offsets
  38. FEnds:        DCB.L    5,0        ; text block ends
  39. FSPtr:        DC.W    -4        ; file stack pointer
  40.         
  41. Events:        DC.W    Null-Base    ;  0. Null Event ( 116 +md )
  42.         DC.W    BDEvt-Base    ;  1. Mouse button down ( 118 +md )
  43.         DC.W    Null-Base    ;  2. Mouse button up ( 120 +md )
  44.         DC.W    KeyEvt-Base    ;  3. Key down ( 122 +md )
  45.         DC.W    Null-Base    ;  4. Key up ( 124 +md )
  46.         DC.W    KeyEvt-Base    ;  5. Auto key ( 126 +md )
  47.         DC.W    UDEvt-Base    ;  6. Update window ( 128 +md )
  48.         DC.W    Null-Base    ;  7. Disk inserted event ( 130 +md )
  49.         DC.W    ActEvt-Base    ;  8. Activate window ( 132 +md )
  50.         DC.W    Null-Base    ;  9. reserved ( 134 +md )
  51.         DC.W    doAEvent-Base    ; A. do AppleEvent ( 136 +md )
  52.         DC.W    Null-Base    ; B. I/O driver ( 138 +md )
  53.         DC.W    Null-Base    ; C. Undefined1 ( 140 +md )
  54.         DC.W    Null-Base    ; D. Undefined2 ( 142 +md )
  55.         DC.W    Null-Base    ; E. Undefined3 ( 144 +md )
  56.         DC.W    MFEvt-Base    ; F. mouse & suspend/resume ( 146 +md )
  57.  
  58. EventRecord:
  59.   What:        DC.W    0        ; WhatEvent# ( 148 +md )
  60.   Message:    DC.W    0        ; key code, wptr, etc. ( 150 +md )
  61.    ASCII:    DC.W    0        ; ASCII code  ( 152 +md )
  62.   When:        DC.L    0        ; Ticks since startup ( 154 +md )
  63.   Where:                ; Mouse coordinates ( 158 +md )
  64.    V:        DC.W    0
  65.    H:        DC.W    0
  66.   Modify:    DC.W    0        ; State of modifier keys ( 162 +md )
  67.  
  68. WWindow:    DC.L    0        ; WindowPtr from FindWindow ( 164 +md )
  69. Clicks:        DC.W    Null-Base    ; InDesk ( 168 +md )
  70.         DC.W    MenuBar-Base    ; InMenu Bar ( 170 +md )
  71.         DC.W    DARgn-Base    ; InSystem Window ( 172 +md )
  72.         DC.W    ContentRgn-Base    ; InContent region ( 174 +md )
  73.         DC.W    DragRgn-Base    ; InDrag region ( 176 +md )
  74.         DC.W    Null-Base    ; InGrow region ( 178 +md )
  75.         DC.W    CloseRgn-Base    ; ByeByeBox ( 180 +md )
  76.         DC.W    beep-base    ; inZoomIn ( 182 +md )
  77.         DC.W    beep-base    ; inZoomOut ( 184 +md )
  78.  
  79. MFlag:        DC.W    0        ; true if multitasking ( 186 +md )
  80. AEvents:    DC.W    ae1-base    ; address of first AEentry ( 188 +md )
  81. AError:        DC.W    drop-base    ; process AEerror number ( 190 +md )
  82. KFlag:        DC.W    0        ; key flag  ( 192 +md )
  83. doneFlag:    DC.W    0        ; done flag  ( 194 +md )
  84. openFlag:    DC.W    0        ; open flag  ( 196 +md )
  85. AEReply:    DC.L    0        ; Apple Event Reply ( 198 +md )
  86. AEEventRecord:    DC.L    0        ; Apple Event Event Record ( 202 +md )
  87.  
  88. ; addresses beyond this are not documented relative to +md
  89. oldIdle:    DC.W    0
  90. Desc:        DC.L    0,0
  91. Scratch:    DC.L    0
  92. SaveAERegs:    DC.L    0,0,0,0        ; Dict,DP,IS,PS
  93. BigRect:    DC.W    $8000,$8000,$7FFF,$7FFF        ; for dragging
  94.  
  95.     ae1:    DC.L    'aevt'
  96.         DC.L    'oapp'
  97.         DC.W    aenull-base
  98.         DC.W    ae2 -base
  99.     ae2:    DC.L    'aevt'
  100.         DC.L    'odoc'
  101.         DC.W    aeopen-base
  102.         DC.W    ae3 -base
  103.     ae3:    DC.L    'aevt'
  104.         DC.L    'pdoc'
  105.         DC.W    aenull-base
  106.         DC.W    ae4 -base
  107.     ae4:    DC.L    'aevt'
  108.         DC.L    'quit'
  109.         DC.W    aebye-base,0
  110.  
  111. Menus:        DC.W    Fmenu-base
  112.         DC.W    Emenu-base
  113.     Fmenu:    DC.W    open-base    ; Open…
  114.         DC.W    null-base    ; -
  115.         DC.W    csave-base    ; Save
  116.         DC.W    mon-base    ; Debug
  117.         DC.W    null-base    ; -
  118.         DC.W    beep-base    ; Print
  119.         DC.W    null-base    ; -
  120.         DC.W    by-base        ; Quit
  121.     Emenu:    DC.W    beep-base    ; Undo
  122.         DC.W    null-base    ; -
  123.         DC.W    beep-base    ; Cut
  124.         DC.W    beep-base    ; Copy
  125.         DC.W    paste-base    ; Paste
  126.         DC.W    beep-base    ; Clear
  127.  
  128. ; addresses beyond this are relative to tib
  129. TermBuf        DCB.B    82,32        ; command line buffer  ( 0 tib + )
  130.  
  131. ; User variable data
  132. StackSize:    DC.W    2048        ; variable stack size  ( 82 tib + )
  133. IntA7:        DC.L    0        ; initial value for A7  ( 84 tib + )
  134. Rzero:        DC.L    0        ; value for A7 after linking  ( 88 tib + )
  135. Szero:        DC.L    0        ; bottom of stack  ( 92 tib + )
  136. Form:        DC.L    $FFFF0007    ; decaform record  ( 96 tib + )
  137. Expand:        DC.L    0        ; hold address of expand routine  ( 100 tib + )
  138. FreePt:        DC.W    dictend-Base    ; initial compile point freespace  ( 104 tib + )
  139. FreeSz:        DC.W    base+32767-dictend    ; max headroom  ( 106 tib + )
  140. DictPt:        DC.W    task-theLink    ; initial dict. search start  ( 108 tib + )
  141. NBase:        DC.W    10        ; the numeric radix  ( 110 tib + )
  142. Held:        DC.W    0        ; the HLD data  ( 112 tib + )
  143. DoesAddr:    DC.L    0        ; "does>" jump address  ( 114 tib + )
  144. fcolon:        DC.B    0        ;   compile mode  ( 118 tib + )
  145. fimmed:        DC.B    0        ;   immediate flag  ( 119 tib + )
  146. fneg:        DC.B    0        ;   negative flag  ( 120 tib + )
  147. fint:        DC.B    $80        ;   interactive mode  ( 121 tib + )
  148. fmacro:        DC.W    0        ;   macro flag+filler  ( 122 tib + )
  149.  
  150.  
  151. ; ----- Startup Code -----
  152.  
  153. MacStart:    ; load the menus, setup a window and create a data block
  154.     MOVEQ    #1,D3
  155.     @0: CLR.L    -(SP)            ; room
  156.     MOVE    D3,-(SP)        ; Push menu ID
  157.     _GetRMenu            ; Get menu from resource.
  158.     MOVE    D3,D0
  159.     SUBQ    #1,D0
  160.     ASL    #2,D0
  161.     LEA     AppleMenu,A0        ; menu handle data area
  162.     MOVE.L    (SP),0(A0,D0.W)        ; Save it.
  163.     CLR    -(SP)            ; Push a 0 for append.
  164.     _InsertMenu
  165.     ADDQ    #1,D3
  166.     CMP    #4,D3
  167.     BNE.S    @0            ; do the next menu
  168.  
  169.     MOVE.L    AppleMenu,-(SP)
  170.     MOVE.L    #'DRVR',-(SP)        ; Load all DRVR resource types.
  171.     _AddResMenu            ; Add the DA's.
  172.     _DrawMenuBar
  173.  
  174.     ; create a window
  175.     CLR.L    -(SP)            ; make room for the new window pointer
  176.     MOVE    #128,-(SP)        ; WIND ID
  177.     CLR.L    -(SP)            ; put it on the heap
  178.     MOVE.L    #-1,-(SP)        ; behind none
  179.     MOVE.L    #'qd  ',-(PS)
  180.     JSR    qgestalt-base(BP)
  181.     TST    (PS)+
  182.     BEQ.S    @1
  183.     MOVE.L    (PS)+,D0
  184.     CMP    #$100,D0
  185.     BLT.S    @1
  186.     _GetNewCWindow
  187.     BRA.S    @2
  188.     @1:    _GetNewWindow
  189.     @2:    MOVE.L  (SP),theWindow-base(BP)
  190.     MOVE.L    (SP),-(SP)
  191.     MOVE.L    WSize-base(BP),-(SP)
  192.     CLR.W    -(SP)
  193.     _SizeWindow
  194.     MOVE.L    (SP),-(SP)
  195.     _ShowWindow
  196.     _SetPort
  197.     
  198.     ; create a temp scrap holder
  199.     MOVE.L    #10,D0            ; this is just a size
  200.     _NewHandle            ; create a handle
  201.     MOVE.L    A0,TextH-base(BP)    ; to hold clipboard data
  202.  
  203.     ; Check for multitasking environment
  204.     CLR    MFlag-base(BP)        ; set MFlag to 0
  205.     MOVE.W    #$A89F, D0        ; _Unimplemented
  206.     _GetTrapAddress            ; NGetTrapAddress
  207.     MOVE.L    A0,D1
  208.     MOVE.W    #$A860,D0        ; _WaitNextEvent
  209.     _GetTrapAddress            ; NGetTrapAddress
  210.     CMP.L    A0,D1
  211.     BEQ.S    @3            ; no multitasking
  212.     MOVE.W    #$100,MFlag-base(BP)    ; set multitasking flag
  213.  
  214.     ; install apple event handlers if running system 7
  215.     @3:    MOVE.L    #'evnt',-(PS)
  216.     JSR    QGestalt-base(BP)
  217.     TST    (PS)+            ; check for gestalt
  218.     BEQ.S    @5            ; no gestalt, just return
  219.     SUBQ.L    #1,(PS)+        ; check for apple events present
  220.     BNE.S    @5            ; no apple events, just return
  221.     MOVE    AEvents-base(BP),D0    ; start rel addr of the events list
  222.     @4:    LEA    0(BP,D0.W),A4        ; start addr of an item
  223.     CLR    -(A7)            ; result
  224.     MOVE.L    (A4),-(A7)        ; push event class
  225.     MOVE.L    4(A4),-(A7)        ; push event selector
  226.     MOVE    8(A4),D0        ; get rel addr of handler
  227.     PEA    0(BP,D0.W)        ; push abs addr of handler
  228.     PEA    (BP)            ; push refcon
  229.     CLR    -(A7)            ; not syshandler
  230.     _AEInstallEvent        ; INSTALL EACH EVENT IN THE LIST
  231.     TST    (A7)+            ; drop result
  232.     MOVE    10(A4),D0        ; get rel addr of next item
  233.     BNE.S    @4            ; a zero indicates done
  234.  
  235.     @5:    RTS
  236.  
  237.  
  238. ; ----- Event Loop ------
  239.  
  240. doDone:    MOVEA.L    intA7-base(BP),A7    ; *** quit PocketForth ***
  241.     RTS
  242.  
  243. doOpen:    CLR    openFlag-base(BP)
  244.     JMP    doload-base(BP)
  245.  
  246. NextEvent:
  247.     CLR    KFlag-base(BP)        ; clear the key flag
  248.     CLR    -(SP)            ; turn all menus white
  249.     _HiLiteMenu
  250.  
  251.     TST    doneFlag-base(BP)
  252.     BNE.S    dodone
  253.  
  254.      TST    openFlag-base(BP)
  255.      BNE.S    doopen
  256.  
  257.     MOVE    Runner-base(BP),D0
  258.     JSR    0(BP,D0.W)        ; run the idle routine
  259.  
  260.     clr.l    -(sp)
  261.     subq    #1,(sp)
  262.     PEA    EventRecord-base(BP)    ; event record to be filled
  263.  
  264.     TST    MFlag-base(BP)        ; running multitasking?
  265.     BNE.S    @1            ; if not, do SystemTask/GetNextEvent
  266.  
  267.     _SystemTask            ; handle DA's, etc.
  268.     _GetNextEvent            ; fill the event record
  269.     BRA.S    @2
  270.  
  271.     @1:    CLR.L    -(SP)            ; 0 sleep ticks
  272.     CLR.L    -(SP)            ; nil mouse region
  273.     _WaitNextEvent            ; get multitasking event
  274.  
  275.     @2:    TST    (SP)+            ; Is this an event?
  276.     BEQ.S    rdr            ;   no  this is a non-event
  277.  
  278.     MOVE    What-base(BP),D0    ; check the event number
  279.     CMPI    #23,D0            ; is it a HighLevelEvent?
  280.     BNE.S    @3
  281.     MOVEQ    #10,D0            ; remap HLEs to event 10 (IM VI5-12)
  282.  
  283.     @3:    LEA    Events-base(BP),A0
  284.   hop1:    ADD    D0,D0            ; Calculate and jump to the ...
  285.     MOVE    0(A0,D0.W),D0        ; ... rel addr of the routine ... 
  286.   hop2:    JMP    0(BP,D0.W)        ; ... in the Events list.
  287.  
  288. ; -- Mouse Down Event --
  289.  
  290. BDEvt:    CLR    -(SP)            ; Result of find window
  291.     MOVE.L    Where-base(BP),-(SP)    ; Mouse point of click.
  292.     PEA    WWindow-base(BP)    ; Var. for pointer of clicked wind.
  293.     _FindWindow            ; Returns window region code ...
  294.     CLR.L    D0            ; ... (see p. WM-27 in IM).
  295.     MOVE    (SP)+,D0        ; Pop part number
  296.     LEA    Clicks-base(BP),A0    ; clicks is an array of rel.addrs
  297.     BRA.S    hop1
  298.  
  299.     MenuBar:
  300.     CLR.L    -(SP)            ; Make room for menu choice data.
  301.     MOVE.L    Where-base(BP),-(SP)    ; Mouse coordinates of click.
  302.     _MenuSelect            ; Get the selected Menu data.
  303.     MOVE.L    (SP)+,-(PS)        ; menu ID and item to pstack.
  304.     bra.s    domenu
  305.         
  306.     DARgn:
  307.     PEA    EventRecord-base(BP)
  308.     MOVE.L    WWindow-base(BP),-(SP)
  309.     _SystemClick
  310.     RTS
  311.     
  312.     DragRgn:
  313.     MOVE.L    WWindow-base(BP),-(SP)    ; push The Window Pointer
  314.     MOVE.L    Where-base(BP),-(SP)    ; push The Mouse Coordinates
  315.     PEA    BigRect-base(BP)    ; The drag boundry limits
  316.     _DragWindow            ; Drag it
  317.    rdr:    RTS
  318.  
  319.     CloseRgn:
  320.     CLR    -(SP)
  321.     MOVE.L    WWindow-base(BP),-(SP)
  322.     MOVE.L    Where-base(BP),-(SP)
  323.     _TrackGoAway
  324.     MOVE    (SP)+,D0
  325.     BEQ.S    rdr
  326.     by:    MOVE    Closer-base(BP),D0    ; inital value: bye-base
  327.     BRA.S    hop2
  328.  
  329.     ContentRgn:                ; select the clicked in window.
  330.     MOVE.L    WWindow-base(BP),-(SP)
  331.     _SelectWindow
  332.     MOVE    Button-base(BP),D0    ; inital value: beep-base
  333.     BRA.S    hop2
  334.  
  335. ; -- Key Down Event --
  336.  
  337. KeyEvt:    _ObscureCursor
  338.     MOVE    Message+2-base(BP),D0
  339.     AND    #$FF,D0            ; D0 has the ASCII code of the key.
  340.     MOVE    Modify-base(BP),D1
  341.     BTST    #8,D1
  342.     BNE.S    CommandKey
  343.     MOVE    D0,kflag-base(BP)
  344.     @0:    RTS
  345.  
  346. ; Menu actions
  347.     CommandKey:                ; handle the menu choices.
  348.     CLR.L    -(SP)            ; Room for menu data.
  349.     MOVE    D0,-(SP)        ; Push ASCII.
  350.     _MenuKey            ; Get the menu data.
  351.     MOVE.L    (SP)+,-(PS)        ; menu ID and item to pstack.
  352.     DoMenu:    ; Determine which menu was used.
  353.     TST    2(PS)            ; is the item number = 0?
  354.     BEQ    twodrop            ; no menu selection, drop data
  355.     
  356.     CMPI    #1,(PS)            ; Is it the Apple menu? ...
  357.     BEQ.S    DoAppleMenu        ; handle this special case
  358.  
  359.     CMPI    #3,(PS)            ; Is it the Edit menu?
  360.     BNE.S    @0            ; the last special case *
  361.     CLR.L    -(SP)            ; Check if it's a DA window
  362.     _FrontWindow
  363.     MOVE.L    (SP)+,A0
  364.     TST    $6C(A0)            ; windowKind(FrontWindow)
  365.     BGE.S    @0            ; negative=dawindow
  366.  
  367.     TST    (PS)+            ; drop the menu id
  368.     CLR    -(SP)
  369.     MOVE    (PS)+,-(SP)        ; push item-1
  370.     SUBQ    #1,(SP)
  371.     _SysEdit            ; do the da edit stuff
  372.     TST    (SP)+
  373.     RTS
  374.  
  375.     @0:    MOVE    YourMenu-base(BP),D0    ; inital value:
  376.     LEA    0(BP,D0.W),A0        ; do a double indexed reference
  377.     MOVE    (PS)+,D0
  378.     SUBQ    #2,D0
  379.     ADD    D0,D0
  380.     MOVE    0(A0,D0.W),D0
  381.      LEA    0(BP,D0.W),A0
  382.     MOVE    (PS)+,D0
  383.     SUBQ    #1,D0
  384.     JMP    hop1-base(BP)
  385.  
  386. DoAppleMenu:
  387.     CLR    (PS)+
  388.     MOVE    (PS)+,D1
  389.     CMP    #1,D1            ; Is it the first item?
  390.     BNE.S    @0
  391.     MOVE    about-base(BP),D0
  392.     JMP    0(BP,D0.W)
  393.     @0:    PEA    WWindow            ; Its a DA
  394.     _GetPort
  395.     MOVE.L    AppleMenu-base(BP),-(SP)
  396.     MOVE    D1,-(SP)
  397.     PEA    (A2)            ; name at here
  398.     _GetItem
  399.     CLR    -(SP)
  400.     PEA    (A2)
  401.     _OpenDeskAcc
  402.     MOVE    (SP)+,D0
  403.     MOVE.L    WWindow-base(BP),-(SP)
  404.     _SetPort
  405.     RTS
  406.  
  407. DoAbout:
  408.     CLR    -(SP)            ; Room for which item number.
  409.     MOVE    #257,-(SP)        ; Resource ID of AboutDialog
  410.     CLR.L    -(SP)
  411.     _Alert                ; About Item
  412.     CLR    (SP)+            ; Don't care which item dismissed.
  413.     RTS
  414.  
  415. ; -- Update Event --
  416.  
  417. UDEvt:    PEA    WWindow-base(BP)
  418.     _GetPort
  419.     MOVE.L    WWindow-base(BP),-(SP)    ; push for _SetPort
  420.     MOVE.L    Message-base(BP),-(SP)    ; push wpointer for _EndUpdate
  421.     MOVE.L    (SP),-(SP)        ; push for _SetPort
  422.     MOVE.L    (SP),-(SP)        ; push for _BeginUpdate
  423.     _BeginUpdate            ; restrict to invalid region
  424.     _SetPort            ; specify this window
  425.     MOVE    Update-base(BP),D0    ; inital value: curs-base
  426.     JSR    0(BP,D0.W)        ; execute the draw routine
  427.     _EndUpdate            ; go back to current cliprgn
  428.     _SetPort
  429.     RTS
  430.  
  431. ; -- Activate Event --
  432.  
  433. ActEvt:    CLR    -(PS)            ; modify has on/off flag in bit 0
  434.     BTST    #0,Modify+1-base(BP)
  435.   act1:    BEQ.S    @0
  436.     SUBQ    #1,(PS)
  437.     @0:    MOVE    Activate-base(BP),D0    ; inital value: drop
  438.     JMP    0(BP,D0.W)
  439.  
  440. ; ---- Activate/Suspend ----
  441.  
  442. MFEvt:    CLR    -(PS)
  443.     TST    message-base(BP)
  444.     BMI    drop
  445.     BTST    #0,message+3-base(BP)
  446.     BRA.S    act1
  447.  
  448. ; ---- High Level Event ----
  449.  
  450. DoAEvent:
  451.     MOVEM.L    Dict/DP/IS/PS,saveAERegs-base(BP) ; send along PF's regs
  452.     CLR    -(SP)
  453.     PEA    eventRecord-base(BP)
  454.     _AEProcessAppleEvent
  455.     MOVE    (SP)+,-(PS)
  456.     BEQ.S    noaer
  457.     MOVE    AError-base(BP),D0
  458.     JMP    0(BP,D0.W)
  459.  noaer:    MOVEM.L    saveAERegs-base(BP),Dict/DP/IS/PS ; update PF's regs
  460.     RTS
  461.  
  462. aepre:    MOVEM.L    (SP)+,A0/A1/BP
  463.     MOVE.L    (SP)+,AEReply-base(BP)        ; store reply
  464.     MOVE.L    (SP)+,AEEventRecord-base(BP)    ; store event record
  465.     CLR    (SP)                ; return no error
  466.     MOVE.L    A1,-(SP)            ; re-stack the return addr
  467.     MOVEM.L    Dict/DP/IS/PS,-(SP)        ; stash the system regs
  468.     MOVEM.L    saveAERegs-base(BP),Dict/DP/IS/PS  ; load PF regs
  469.     JMP    (A0)
  470.  
  471. aenull:    BSR.S    aepre
  472.   aert:    BSR.S    aepost
  473.     RTS
  474.  
  475. aebye:    BSR.S    aepre
  476.     JSR    by-base(BP)
  477.     BRA.S    aert
  478.  
  479. aeopen:    BSR.S    aepre
  480.     BSR.S    aeopn
  481.     BRA.S    aert
  482.  
  483. aepost:    MOVE.L    (SP)+,A0
  484.     MOVEM.L    Dict/DP/IS/PS,saveAERegs-base(BP)  ; save PF regs
  485.     MOVEM.L    (SP)+,Dict/DP/IS/PS    ; restore the system regs
  486.     JMP    (A0)
  487.  
  488. aeopn:    CLR    -(SP)
  489.     MOVE.L    AEEventRecord-base(BP),-(SP)
  490.     MOVE.L    #'----',-(SP)
  491.     MOVE.L    #'list',-(SP)
  492.     PEA    desc-base(BP)
  493.     _AEGetParamDesc
  494.     TST    (SP)+
  495.     BNE.S    @0
  496.     MOVE    runner-base(bp),oldidle-base(BP)
  497.     MOVE    #odocidle-base,runner-base(BP)
  498.     @0:    RTS
  499.  
  500. OdocIdle:    ; Open the document in the idle handler
  501.     MOVE    oldIdle-base(bp),runner-base(BP)    ; reset old handler
  502.     CLR    -(SP)
  503.     PEA    desc-base(BP)
  504.     CLR.L    -(SP)
  505.     ADDQ.L    #1,(SP)            ; index = 1
  506.     MOVE.L    #'fss ',-(SP)        ; desired type
  507.     PEA    108(A2)            ; keyword
  508.     PEA    112(A2)            ; desc type
  509.     PEA    34(A2)            ; data pointer
  510.     MOVE.L    #70,-(SP)
  511.     PEA    104(A2)
  512.     _AEGetNthPtr            ; Get fssPtr at here + 34
  513.     TST    (SP)+            ; test for error
  514.     BNE.S    @1
  515.  
  516.     ; clear out a buffer for working directory param. block
  517.     LEA    40+64+80(A2),A0
  518.     MOVE    #19,D0
  519.     @0:    CLR.L    -(A0)
  520.     DBRA    D0,@0
  521.  
  522.     ; calc working directory here
  523.     MOVE    34(A2),22(A0)        ; -> ioVRefNum
  524.     MOVE.L    36(A2),48(A0)        ; -> ioWDDirID
  525.     _OpenWD
  526.     MOVE    22(A0),-(PS)        ; <- working directory
  527.  
  528.     ADDQ    #1,openFlag-base(BP)
  529.  
  530.     @1:    CLR    -(SP)            ; Be neat
  531.     PEA    desc-base(BP)
  532.     _AEDisposeDesc
  533.     ADDQ.L    #2,SP
  534.     RTS
  535.  
  536. ; Pasting support
  537.  
  538. ClearTermBuf:
  539.     MOVEQ    #76,D0
  540.     LEA    TermBuf-base(BP),IS
  541.     @0:    MOVE.L    #$20202020,0(IS,D0)    ; fill line buffer with blanks
  542.     SUBQ.B    #4,D0
  543.     BGE.S    @0
  544.     RTS
  545.  
  546. EmptyFS: ; clear pending loads from the file stack
  547.     TST    fsptr-base(BP)
  548.     BMI.S    @1
  549.     LEA    fstack-base(BP),A1
  550.     MOVE    fsptr-base(BP),D0
  551.     MOVE.L    0(A1,D0.W),A0        ; A0 has the next load block addr
  552.     MOVE.L    A0,D1
  553.     BEQ.S    @0            ; dont try to dispose of nil handle
  554.     CLR.L    0(A1,D0.W)
  555.     CMPA.L    TextH-base(BP),A0
  556.     BEQ.S    @0
  557.     _DisposHandle
  558.     @0:    SUBQ    #4,fsptr-base(BP)
  559.     BRA.S    emptyfs
  560.     @1:    RTS
  561.  
  562. Paste:    JSR    nocurs-base(BP)
  563.     CLR.L    -(SP)
  564.     MOVE.L    TextH-base(BP),-(SP)    ; handle to the scrap data
  565.     MOVE.L    #'TEXT',-(SP)
  566.     PEA    TextO-Base(BP)
  567.     _GetScrap
  568.     MOVE.L    (SP)+,TextE-base(BP)    ; put the length at TextE
  569.     MOVE.L    TextH-base(BP),A0    ; get a handle to the scrap data
  570.     MOVE.L    (A0),D0            ; derefrence the scrap handle
  571.     MOVE.L    D0,TextO-base(BP)    ; set TextO to start of scrap data
  572.     ADD.L    D0,TextE-base(BP)    ; set TextE to end of scrap data
  573.     _HLock                ; don't let data move during paste
  574.     CLR    fsptr-base(BP)
  575.     MOVE.L    TextH-base(BP),fstack-base(BP)
  576.     MOVE.L    TextO-base(BP),fofsets-base(BP)
  577.     MOVE.L    TextE-base(BP),fends-base(BP)
  578.     go:    CLR.B    fint-base(BP)        ; leave keyboard mode
  579.     JMP    CRet-base(BP)        ; get next line
  580.  
  581. Pasting:    ; GetInput comes here for input when fint-base(BP) is 0
  582.     JSR    ClearTermBuf-base(BP)
  583.     CLR.L    D1            ; clear the character count
  584.     CLR.L    D0            ; and the character
  585.     MOVE.L    TextO-base(BP),A0    ; set the input address
  586.     @0:    MOVE.B    0(A0,D1.W),D0        ; BEGIN  get a character
  587.     cmp.b    #9,d0            ; skip over tabs
  588.     bne.s    @1            ; by substituting spaces
  589.     moveq    #bl,d0            ; in the input stream
  590.     @1:    CMP.B    #CR,D0            ;     is it not a CR?
  591.     BEQ.S    @2
  592.     CMPI.B    #78,D1            ;     or 78 characters in buffer
  593.     BGE.S    @2            ; WHILE
  594.         MOVE.B    D0,0(IS,D1)        ;     stash it into buffer
  595.     ADDQ.B    #1,D1            ;     increment count
  596.     BRA.S    @0            ; REPEAT
  597.     @2:    ADDQ.B    #1,D1            ; increment count
  598.     MOVE.B    #CR,0(IS,D1)        ; stash CR into buffer
  599.     MOVE    D1,-(PS)        ; preserve count for TYPE
  600.     ADD.L    TextO-base(BP),D1
  601.     MOVE.L    D1,TextO-base(BP)
  602.     CMP.L    TextE-base(BP),D1    ; IS the block done (TextO>TextE)?
  603.     BMI.S    tandr            ; just type and return if not.
  604.     MOVE    fsptr-base(BP),D0
  605.     LEA    fstack-base(BP),A0
  606.     MOVE.L    0(A0,D0.W),A0
  607.     _HUnlock            ; unlock the block
  608.     BMI    huh
  609.     CMPA.L    TextH-base(BP),A0
  610.     BEQ.S    @3            ; keep the scrap block
  611.     _DisposHandle            ; dispose of loaded blocks
  612.     BMI    huh
  613.  
  614.     @3:    SUBQ    #4,fsptr-base(BP)    ; pop fstack
  615.     BMI.S    @4            ; branch if no pending loads
  616.  
  617.     MOVE    fsptr-base(BP),D0
  618.     LEA    fofsets-base(BP),A0    ; set TextO to (fofsets+fsptr)
  619.     MOVE.L    0(A0,D0.W),TextO-base(BP)
  620.     LEA    fends-base(BP),A0
  621.     MOVE.L    0(A0,D0.W),TextE-base(BP)
  622.     BRA.S    tandr
  623.  
  624.     @4:    BSET.B    #7,fint-base(BP)    ; set keyboard mode
  625.  tandr:    TST    echo-base(BP)
  626.     BNE.S    @5
  627.     JMP    drop-base(BP)
  628.     @5:    MOVE    #termbuf-base,-(PS)
  629.     JSR    swapp-base(BP)
  630.     JSR    type-base(BP)
  631.     JMP    doCR-base(BP)        ; TIB count TYPE CR ;
  632.